# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/26 19:04 
@Author  : ZhangShenao 
@File    : basic.py 
@Desc    : dict字典是一种用来存放若干键值对的数据结构
dict本质上就是一组映射关系
dict中的key必须是Immutable类型,而value可以是任意类型
dict本身是可变的,可以向其中添加、删除、修改键值对

在Python3.7+版本,dict正式被确定为有序
"""

# 创建dict
codes = {
    '010': '北京',
    '024': '沈阳',
}
print(f'codes = {codes}')

# 向dict中添加键值对
codes['021'] = '上海'
print(f'codes = {codes}')

# 直接通过key获取value
v1 = codes['010']
print(f'v1 = {v1}')
# 如果key不存在,会抛出KeyError异常
# v2 = codes['011']  # KeyError: '011'

# 使用get()函数获取value
v2 = codes.get('010')
print(f'v2 = {v2}')
v3 = codes.get('011')
# 如果key不存在,则返回None
print(f'v3 = {v3}')  # v3 = None
# get()函数可以传入默认值,如果key不存在,则返回value的默认值
v4 = codes.get('011', '未知城市')
print(f'v4 = {v4}')  # v4 = 未知城市

# 使用in关键字,判断dict中是否存在指定的key
print(f'"010" is in codes? {'010' in codes}')  # True
print(f'"011" is in codes? {'011' in codes}')  # False

# 使用keys()函数,获取dict的所有key
keys = list(codes.keys())
print(f'keys = {keys}')

# 使用values()函数,获取dict的所有value
values = list(codes.values())
print(f'values = {values}')

# 使用items()函数,获取dict的所有键值对
for k, v in codes.items():
    print(f'{k}:{v}')

# 使用pop()函数,删除dict中的键值对,并返回删除的值
v5 = codes.pop('010')
print(f'v5 = {v5}')  # v5 = 北京
print(f'codes = {codes}')
# 如果删除一个不存在的key,会抛出KeyError异常
# v6 = codes.pop('011')  # KeyError: '011'
# 如果不希望抛出异常,可以传入默认值
# 默认值仅在键不存在时生效,此时方法将直接返回这个默认值,且跳过删除操作
v7 = codes.pop('011', '未知城市')
print(f'v7 = {v7}')  # v7 = 未知城市

# 使用del关键字,删除dict中的键值对
del codes['021']
print(f'codes = {codes}')
# 如果删除一个不存在的key,会抛出KeyError异常
# del codes['022']  # KeyError: '022'

# 使用popitem()函数,随机删除一个键值对,并返回删除的键值对的二元组
v8 = codes.popitem()
print(f'v8 = {v8}')
print(f'codes = {codes}')

# 使用clear()函数,清空dict中的所有键值对
codes.clear()
print(f'codes = {codes}')

# 修改key对应的value
# 如果key不存在,则会创建键值对
codes['010'] = '北京'
print(codes)

# 使用update()函数,将一个dict中的键值对更新到另一个dict中
source = {
    'k1': 'v1',
    'k2': 'v2',
    'k3': 'v3',
}
updated = {
    'k1': 'v11',
    'k4': 'v4',
}
source.update(updated)
print(f'source = {source}')

# 使用len()函数,获取dict中的键值对数量
print(f'length of source is: {len(source)}')
